package com.sky.controller.admin;

import com.sky.DTO.TurnoverStatisticsDTO;
import com.sky.pojo.Orders;
import com.sky.result.Result;
import com.sky.service.ReportService;
import com.sky.vo.OrderReportVO;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.SalesTop10ReportVO;
import com.sky.vo.UserReportVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;

@RestController
@Slf4j
@RequestMapping("/admin/report")//商家管理端的报表统计接口 report statistics(报表统计)
@Api(tags = "数据统计报表-用于")
@RequiredArgsConstructor//final修饰的类的对象在创建时，会自动调用构造函数自动依赖注入
@CrossOrigin//解决跨域问题
public class ReportController {

    private final ReportService reportService;

    /**
     * ## 营业额统计接口
     * <p>
     * <a id=营业额统计接口> </a>
     * <p>
     * ### 基本信息
     * <p>
     * **Path：** /admin/report/turnoverStatistics
     * <p>
     * **Method：** GET
     * <p>
     * **接口描述：**
     * <p>
     * <p>
     * ### 请求参数
     * <p>
     * **Query**
     * <p>
     * | 参数名称 | 是否必须 | 示例       | 备注     |<br>
     * | -------- | -------- | ---------- | -------- |<br>
     * | begin    | 是       | 2022-05-01 | 开始日期 |<br>
     * | end      | 是       | 2022-05-31 | 结束日期 |<br>
     */
    @ApiOperation(value = "营业额统计接口", notes = "营业额统计接口")
    @GetMapping("/turnoverStatistics")
    //接收前端传递的开始日期和结束日期参数
    public Result<TurnoverStatisticsDTO> turnoverStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
        //记录日志
        log.info("营业额统计接口，开始日期：{}，结束日期：{}", begin, end);

        //业务:查询营业额统计数据(获取订单状态为已完成的订单的总金额和下单时间的统计数据)
        TurnoverStatisticsDTO turnoverStatisticsDTO = reportService.turnoverStatistics(begin, end);

        //返回统一的响应结果
        return Result.success(turnoverStatisticsDTO);
    }

    /**
     * ## 用户统计接口<br>
     *
     * <a id=用户统计接口> </a>
     * <p>
     * ### 基本信息<br>
     * <p>
     * **Path：** /admin/report/userStatistics<br>
     * <p>
     * **Method：** GET<br>
     * <p>
     * **接口描述：**<br>
     * <p>
     * <p>
     * ### 请求参数<br>
     * <p>
     * **Query**<br>
     * <p>
     * | 参数名称 | 是否必须 | 示例       | 备注     |<br>
     * | -------- | -------- | ---------- | -------- |<br>
     * | begin    | 是       | 2022-05-01 | 开始日期 |<br>
     * | end      | 是       | 2022-05-31 | 结束日期 |<br>
     */
    @ApiOperation(value = "用户统计接口", notes = "用户统计接口")
    @GetMapping("/userStatistics")
    //接收前端传递的开始日期和结束日期参数
    public Result<UserReportVO> userStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
        //记录日志
        log.info("用户统计接口，开始日期：{}，结束日期：{}", begin, end);

        //业务:查询用户统计数据(获取下单用户的统计数据包括新增用户和用户总数)
        UserReportVO userReportVO = reportService.userStatistics(begin, end);

        //返回统一的响应结果
        return Result.success(userReportVO);
    }


    /**
     * ## 订单统计报表接口<br>
     *
     * <a id=订单统计接口> </a>
     * <p>
     * ### 基本信息<br>
     * <p>
     * **Path：** /admin/report/ordersStatistics<br>
     * <p>
     * **Method：** GET<br>
     * <p>
     * **接口描述：**<br>
     * <p>
     * <p>
     * ### 请求参数<br>
     * <p>
     * **Query**<br>
     * <p>
     * | 参数名称 | 是否必须 | 示例       | 备注     |<br>
     * | -------- | -------- | ---------- | -------- |<br>
     * | begin    | 是       | 2022-05-01 | 开始日期 |<br>
     * | end      | 是       | 2022-05-31 | 结束日期 |<br>
     */
    @ApiOperation(value = "订单统计接口", notes = "订单统计接口-获取订单总数,有效订单数,订单完成率")
    @GetMapping("/ordersStatistics")
    //接收前端传递的开始日期和结束日期参数
    public Result<OrderReportVO> ordersStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
        //记录日志
        log.info("订单统计接口，开始日期：{}，结束日期：{}", begin, end);

        //业务:查询订单统计数据(获取订单总数,有效订单数,订单完成率)
        OrderReportVO ordersStatistics = reportService.ordersStatistics(begin, end);

        //返回统一的响应结果
        return Result.success(ordersStatistics);
    }

    /**
     * ## 查询销量排名top10接口<br>
     *
     * <a id=查询销量排名top10接口> </a>
     * <p>
     * ### 基本信息<br>
     * <p>
     * **Path：** /admin/report/top10<br>
     * <p>
     * **Method：** GET<br>
     * <p>
     * **接口描述：**<br>
     * <p>
     * <p>
     * ### 请求参数<br>
     * <p>
     * **Query**<br>
     * <p>
     * | 参数名称 | 是否必须 | 示例       | 备注     |<br>
     * | -------- | -------- | ---------- | -------- |<br>
     * | begin    | 是       | 2022-05-01 | 开始日期 |<br>
     * | end      | 是       | 2022-05-31 | 结束日期 |<br>
     */
    @ApiOperation(value = "查询销量排名top10接口", notes = "获取商品名称列表和商品销量列表")
    @GetMapping("/top10")
    //接收前端传递的开始日期和结束日期参数
    public Result<SalesTop10ReportVO> top10(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
        //记录日志
        log.info("查询销量排名top10接口，开始日期：{}，结束日期：{}", begin, end);

        //业务:查询销量排名top10数据(获取商品名称列表和商品销量列表)
        SalesTop10ReportVO salesTop10ReportVO = reportService.top10(begin, end);

        //返回统一的响应结果
        return Result.success(salesTop10ReportVO);
    }


    /**
     * 导出营运数据报表到Excel文件<br>
     * 导出Excel报表接口<br>
     * <a id=导出Excel报表接口> </a>
     * 基本信息<br>
     * Path： /admin/report/export<br>
     * Method： GET<br>
     * **接口描述：<br>
     * ### 请求参数<br>
     * 无
     *返回数据<br>
     * 无
     * javascript
     * OK
     */
    @ApiOperation("导出营运数据报表到Excel")
    @GetMapping("export")
    public String exportReport(HttpServletResponse response) {//用来获取把Excel文件写回去的响应输出流
        //记录日志
        log.info("导出运营数据Excel报表,HttpServletResponse:{}", response);
        //业务:查询近30天的运营数据,并导入Excel文件,然后把Excel文件通过响应输出流,写回前端,下载到浏览器
        reportService.exportOperationalDataReports(response);
        //返回响应结果"OK"
        return "OK";

    }
}
